/** @jsxImportSource @emotion/react */
import * as React from "react";
import {
    CCell, Input, InputLine, SuffixInput, Table, TableBody, TableHead, TableRow, Text,
} from "customize-easy-ui-component";
import {InspectRecordLayout, InternalItemProps, SelectHookfork, useItemInputControl,} from "../../common/base";
import {useMeasureInpFilter} from "../../common/hooks";
import {floatInterception, objNestSet} from "../../../common/tool";
import {EachMeasureCritConfig} from "../../common/msCriteria";
import {useJudgmentEdit, useJudgmentTable} from "../../hook/useJudgment";
import {useOmnipotentPref} from "../../hook/useOmnipotentPref";
import {DirectLink} from "../../../routing/Link";

export const Justify_Dom = <div css={{display: 'flex', justifyContent: 'space-between', flexDirection: 'row',flexWrap:'wrap'}}>
    <div>
        <Text>按照 GB／T
            21268-2014中6.10.1和6.10.2规定的工况、试验方法和要求进行试验，检查制动距离、制动稳定性应符合表3的规定要求</Text>
        <Table tight miniw={800}><TableBody>
            <TableRow><CCell colSpan={4}>表3 制动距离和制动稳定性要求</CCell></TableRow>
            <TableRow><CCell>观光车类型(km/h)</CCell><CCell>制动初速度(km/h)</CCell><CCell>空载制动距离(m)</CCell><CCell>试验通道宽度(m)</CCell></TableRow>
            <TableRow><CCell>18&le;最大设计车速&le;30</CCell><CCell>20</CCell><CCell>&le;5.0</CCell><CCell
                rowSpan={3}>车体设计宽度+0.4</CCell></TableRow>
            <TableRow><CCell>最大设计车速&lt;18</CCell><CCell>10</CCell><CCell>&le;2.5</CCell></TableRow>
            <TableRow><CCell>观光列车</CCell><CCell>10</CCell><CCell>&le;3.5</CCell></TableRow>
        </TableBody></Table>
    </div>
    <div>
        <Text>试验中制动实际初速度与规定初速度存在偏差值时，可用如下修正制动距离公式：</Text><br/>
        <div css={{fontSize: 'x-large',display: 'grid'}} dangerouslySetInnerHTML={{
            __html: `<math> <mrow> 
                    <mi>S</mi> <mo>=</mo> <mi>S</mi> <mo>\`</mo>  
                    <mfrac>
                    <mrow> <msup> <mi> <msup> <mi>v<sub>0</sub></mi> </msup> </mi> <mn>2</mn> </msup> </mrow>
                    <mrow> <msubsup> <mtext>v</mtext> <mtext>0</mtext> <mtext>'2</mtext> </msubsup> </mrow>
                    </mfrac>
                </mrow> </math>`
        }}></div>
        S —— 修正后的制动距离，单位为米（m）； S<sup>`</sup> —— 实际制动距离，单位为米（m）；v<sub>0</sub> —— 规定初速度，20km/h或10km/h；
        v<sub>0</sub><sup>'</sup> —— 实际初速度，单位为千米每小时（km/h）。
    </div>
</div>;

//附录A2:最大行驶速度检测； 参数 vlNe 在设计区块的第一行和最后一行都配置了。
//[??]有可能需要，自动计算  v=3.6L/t  这个输入框的？ 编辑器关联格的修改 出发自动修改结果框的，保存？并且人工不能同时修订的？。
export const config制动距离 = [
    [{
        n: '空一往', t: ['3.2.2', '(1)', <Text>（用拖痕法）</Text>],
        x: '第一次空载制动距离（往）', u: 'm', c: '四', d: '1', omit: true, vlNe: 4
        },
        {n: '空一返', t: [undefined, undefined, null], x: '第一次空载制动距离（返）', c: '四', d: '0', omit: true,},
        {n: '空二往', t: [undefined, undefined, null], x: '第二次空载制动距离（往）', c: '四', d: '0', omit: true,},
        {n: '空二返', t: [undefined, undefined, undefined], x: '第二次空载制动距离（返）', c: '四', d: '0', omit: ' ', vlNe: 1},
    ],
    [
        {n: '空制均', t: [undefined, undefined, undefined], x: '空载制动平均距离', c: '四', d: '1',},
    ],
    [{check: '3.2.2(1)',}],
] as EachMeasureCritConfig[][];

export interface Props extends InternalItemProps {
    label: string;
    // config: ( (orc:any)=>EachMeasureCritConfig[][] ) | EachMeasureCritConfig[][];
    iAname?: string[];           //附加的存储那些字段     ，'观测备注'
}
//新的通用配置模型
//标题区最大列数确定的：总体每一行配置如下的[name,titl[{t:'',s: 3}],item,unit]形式；其中titl可变的长度。t是文本,s是跨越几行的TD数默认=1。unit默认='';item=必须有的主标题描述。
//这里第二字段 配置 [],和 [{} ], 不一样的，前者2占列，后者只占一列。
export const items空载制动 = [
    ['仪一往', [], '第一次空载制动距离（往）', 'm'],
    ['仪一返', [], '第一次空载制动距离（返）', 'm'],
    ['仪二往', [], '第二次空载制动距离（往）', 'm'],
    ['仪二返', [], '第二次空载制动距离（返）', 'm'],
    ['仪空制均', [], '空载制动平均距离', 'm'],
];

export const itemA制动距离: string[] = ['规初速', ];
items空载制动.forEach(([name, title, initIsp], i: number) => {
    itemA制动距离.push(name as string);
});

/**【特殊】俩种模式，拼装，表嵌套表！     非正常的观测数据的表格；     @两个配置杂交混合的。
 * 必须拆解前俩个，然后插入一句描述的： 需要一个node插入点的；
 * “制动性能测量仪”区域的： 修正值:采用自动计算做法。
 * */
export const BrakingDistance =
    React.forwardRef((
        {children, show, alone = true, refWidth, label, iAname,}: Props, ref
) => {
    let oldTitle1: any;
    let oldTitle2: any;
    const {inp, setInp} = useItemInputControl({ref});
    const {render, itemObservation, itemObservationA,} = useJudgmentEdit(inp, setInp,
        config制动距离, false, false);
    const itemA = React.useMemo(() => {
        return [...itemObservationA,  ...iAname ?? [], ...itemA制动距离];
    }, [itemObservationA, iAname]);
    const [getInpFilter] = useMeasureInpFilter(itemObservation, itemA,);
    const resulName = (items空载制动[0][0] ?? '仪一往') as string;         //用制动性能测量仪:的检验结果，对应存储名；
    return (
        <InspectRecordLayout inp={inp} setInp={setInp} getInpFilter={getInpFilter} show={show}
                             alone={alone} label={label}>
            <Text variant="h5">{label}：</Text>
            判断标准：
            {Justify_Dom}
            <hr/>
            <Text css={{textIndent: '2rem', display: 'flex', fontSize: '1.2rem'}}>
                检验内容（用拖痕法）&gt;
            </Text>
            {render}
            {children}

            <hr/>
            <Text css={{textIndent: '2rem', display: 'flex', fontSize: '1.2rem'}}>
                检验内容（用制动性能测量仪）&gt;
            </Text>
            <InputLine label='规定初速度'>
                <SuffixInput value={inp?.规初速 || ''} placeholder="用于计算修正值的，20或者10"
                             onChange={e => setInp({
                                 ...inp,
                                 规初速: e.currentTarget.value || undefined
                             })}>km/h</SuffixInput>
            </InputLine>

            {items空载制动.map(([name, titlps, item, unit]: any, i: number) => {
                //前缀可支持三个附加列配置的；
                const [{t: title}, more2, more3] = titlps?.length > 0 ? titlps : ([{}] as any);
                const {t: title2} = more2 || {};
                const {t: title3} = more3 || {};
                oldTitle1 = titlps?.length >= 1 ? (title ? title : oldTitle1) : '';
                oldTitle2 = titlps?.length >= 2 ? (title2 ? title2 : oldTitle2) : '';
                return (<React.Fragment key={i}>
                    <div css={{display: 'flex', flexWrap: 'wrap', alignItems: 'center'}}>
                        <Text>项目{i + 1} {title ?? oldTitle1} - {title2 ?? oldTitle2} {'>'} {title3} {title3 && '>'} {item}：</Text>

                        &nbsp;实际制动初速度
                        <Input value={inp?.[name]?.o || ''} style={{display: 'inline-flex', width: '4rem'}}
                               onChange={e => objNestSet(name, 'o', e.currentTarget.value, inp, setInp)}/>km/h
                        &nbsp;观测数据
                        <Input value={inp?.[name]?.d || ''} style={{display: 'inline-flex', width: '4rem'}}
                               onChange={e => objNestSet(name, 'd', e.currentTarget.value, inp, setInp)}/>m
                        &nbsp;修正值&nbsp;
                        <Text css={{fontSize: '1.1rem'}}>
                            {calcCorrectionBkd(inp?.[name], inp?.规初速, 1) || ''} m
                        </Text>
                        {i >= 4 && <>
                            &nbsp;测量结果
                            <Input value={inp?.[name]?.L || ''} style={{display: 'inline-flex', width: '5rem'}}
                                   onChange={e => objNestSet(name, 'L', e.currentTarget.value, inp, setInp)}/>m
                        </>
                        }
                    </div>
                </React.Fragment>);
            })}
            <InputLine label='用制动性能测量仪-检验结果'>
                <SelectHookfork value={inp?.[resulName]?.r || ''} onChange={e => {
                    objNestSet(resulName, 'r', e.currentTarget.value || undefined, inp, setInp)
                }}/>
            </InputLine>
        </InspectRecordLayout>
    );
});

/**制动距离的修正值：  org* (规定/实际)~2；
 * @param mesu{o ,d }  .o : 实际制动初速度 ;  .d:  制动距离
 */
export function calcCorrectionBkd(mesu: any, regul: number, reservDigit: number = 2)
    : string | undefined {
    const {o: speedo, d: distan} = mesu || {};
    let speedFc = regul / speedo;
    let doubDis = distan * speedFc * speedFc;
    return floatInterception(doubDis, reservDigit);
}

//【耦合点】 config路线坡度
const cfgTs = config制动距离[0][0]?.t;
const inPreN_A1 = <>
    <CCell split rowSpan={11}>{cfgTs?.[0]}</CCell><CCell split rowSpan={11}>{cfgTs?.[1]}</CCell>
    <CCell split rowSpan={11}>{Justify_Dom}</CCell>
</>;
//【注意】结果列，存储的变量是[]?。
const tailRender = (orc: any, name: string, lix: number) => <>
    <CCell>{orc?.[name]?.o ?? '／'}</CCell>
    <CCell>{orc?.[name]?.d ?? '／'}</CCell>
    <CCell>{calcCorrectionBkd(orc?.[name], orc?.规初速, 1) || ''}</CCell>
    {lix === 0 ? <CCell rowSpan={4}>／</CCell> :
        lix === 4 ? <CCell>{orc?.[name]?.L ?? '／'}</CCell> : null
    }
    {lix === 0 && <CCell rowSpan={5}>{orc?.[name]?.r ?? '／'}</CCell>}
</>;

/**【特殊】俩种模式，拼装，表嵌套表！
 * 附录A4:行车制动距离测量  综合两种方案，嵌套展示。 【最复杂,测量方面表格】
 * @property config : 配置 测量数据
 * @property crit : 真的有“判断标准”这个列的， 默认没有；
 * */
export const BrakingDistanceVw = ({orc, rep, label, children, crit}:
                                      { orc: any, rep: any, label: string, children?: any, crit?: boolean }
) => {
    const tag = 'BrakingDistance';
    const renderMeasure = useJudgmentTable({
        rep, orc, nseq: true,
        config: config制动距离, allowableV: false, inPreN: inPreN_A1,
    });
    const [renderBrkTest] = useOmnipotentPref({
        orc, config: items空载制动,
        tailRender, pcols: 1, noNo: true, unitCel: true
    });
    return <>
        <Text variant="h4" css={{
            marginTop: '1rem', "@media print": {paddingBottom: '11rem', pageBreakInside: 'avoid'}
        }}>{label}</Text>
        <Table id={tag} fixed={["2.5%", "2.5%", "%", "24.1%", "3%", "9%", "8%", "6%"]} tight miniw={800}
               css={{borderCollapse: 'collapse', "@media print": {marginTop: '-11rem'}}}>
            <TableHead>
                <TableRow>
                    <CCell colSpan={2}><Text css={{fontSize: '0.8rem'}}>项目序号</Text></CCell>
                    <CCell>判断标准</CCell><CCell><Text css={{fontSize: '0.7rem'}}>检验内容（用拖痕法）</Text></CCell>
                    <CCell>单位</CCell>
                    {crit && <CCell>判断标准</CCell>}
                    <CCell>观测数据</CCell><CCell>测量结果</CCell><CCell><Text
                    css={{fontSize: '0.8rem'}}>检验结果</Text></CCell>
                </TableRow>
            </TableHead>
            <TableBody>
                <DirectLink
                    href={`/report/${rep?.modeltype}/ver/${rep?.modelversion}/${rep?.id}/${tag}?original=1#${tag}`}>
                    {renderMeasure}
                    <TableRow>
                        <CCell split={false} colSpan={5} css={{padding: 0}}>
                            <Table fixed={["%", "4%", "4.5%", "19%", "15%", "12%", "12%", "8%"]} tight miniw={800}
                                   css={{borderCollapse: 'collapse', height: 'fill-available'}}>
                                <TableBody>
                                    <TableRow>
                                        <CCell colSpan={2}><Text
                                            css={{fontSize: '0.75rem'}}>检验内容（用制动性能测量仪）</Text></CCell>
                                        <CCell>单位</CCell><CCell><Text
                                        css={{fontSize: '0.6rem'}}>实际制动初速度(km/h)</Text></CCell><CCell>观测数据</CCell>
                                        <CCell><Text css={{fontSize: '0.8rem'}}>修正值</Text></CCell><CCell><Text
                                        css={{fontSize: '0.8rem'}}>测量结果</Text></CCell>
                                        <CCell><Text css={{fontSize: '0.6rem'}}>检验结果</Text></CCell>
                                    </TableRow>
                                    {renderBrkTest}
                                </TableBody>
                            </Table>
                        </CCell>
                    </TableRow>
                </DirectLink>
            </TableBody>
        </Table>
    </>;
};
